home *** CD-ROM | disk | FTP | other *** search
/ Tech Win 1999 February / TECH Win 02-1999 Disc A.iso / ols / lzh / cgit2001.lzh / cgitools / ReadMe.txt < prev    next >
Encoding:
Text File  |  1998-06-14  |  45.4 KB  |  1,273 lines

  1.  このソフトウエア (CGItools)をご使用になる前に、次の使用承諾書をお
  2. 読みください。その内容に承諾できない場合は、ご使用にならずに含まれる
  3. すべてのファイルを消去してください。
  4.   Before you use this software (CGItools), you must agree with the text 
  5. as follows:
  6.  
  7. *****使用承諾書*****
  8. (The text is written in Japanese.)
  9.  このソフトウエアの著作権は、製作者である森松克実が有します。このソ
  10. フトウエアの使用により生じたすべての不都合について、当方では責任をも
  11. ちません。また、このソフトウエアを何らかの利益を生み出すための営業目
  12. 的に使用する事を禁じます。
  13.  このソフトウエアに含まれる実行型ファイル (*.exe)の全部、またはその
  14. 一部を別のソフトウエアに組み入れて使用する事を禁じます。特に、ファイ
  15. ル中の C++ および Visual Basic のランタイムライブラリに相当する部分に
  16. ついては、マイクロソフト社が定める使用規定に準ずるものとします。
  17.  このソフトウエアに含まれるソースファイルを営業目的に使用する事を禁
  18. じます。
  19.  このソフトウエアは、圧縮ファイル (CGIt2001.zip) のまま変更を加えな
  20. い限り、再配布する事が可能です。ただし、インターネット等の公共の場で
  21. 配布するときは、製作者の許可を必要とします。
  22. ***************
  23.  
  24. _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  25.  
  26.     CGItools ver 2.001
  27.  
  28.     by MORIMATSU, Katsumi
  29.  
  30.     http://members.tripod.com/~KatsumiM/
  31.     katsumim@mypad.com
  32.  
  33. _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  34.  
  35. (はじめに)
  36.  CGItools は、Windows のバッチファイルにより簡単な CGI を行わせるこ
  37. とを一つの目標とした、コマンドプロンプト拡張ツール群です。 CGI 用に
  38. 使わない場合でも、コマンドプロンプトの機能拡張として使用可能です。
  39.  CGI などでファイルを扱う場合、一行の文字数が非常に長いファイルを扱
  40. わなければならないときがあります。一般に提供されているコマンド群では
  41. このような横に長いファイル(1行が 1024 bytes 以上)を扱うと誤作動を
  42. 起こす場合がありますが、CGItools ではこのような横に長いファイルを扱
  43. うことも念頭に置いています。また、インターネット上での使用を考え、コ
  44. ンピューターの種類によって異なる3つの漢字コード(Shift-JIS, EUC, JIS)
  45. や、3つの改行コード(CRLF, CR, LF)に対応したツールになっています。
  46.  Windows NT での使用を考え、MS-DOS プログラムでなく、Windows-32bit 
  47. プログラムとして作成しました。基本的にソースコードはすべて公開します。
  48.  最後に、「こんな機能を Windows に標準で備えておいて欲しい」という
  49. 考えをもちながら、このツールを作成したことを、書き加えておきます。
  50.  
  51.                           製作者 森松克実
  52.  
  53. (インストール方法)
  54.  圧縮ファイル (CGIt2001.zip) を解凍してできた CGItools フォルダを
  55. ハードディスクの任意の場所においてください。なお、p4b-vb.exe は、
  56. Visual Basic 4.0 製なので、Visual Basic ランタイム4がインストール
  57. されていないときは、これを別途インストールする必要があります。
  58.  
  59.  
  60. CGItools ver2.001 リファレンス
  61.  
  62. (目次)
  63.  ①CGItools 使用時の設定について
  64.  ②拡張機能(if, while, do-while, for 文)
  65.  ③条件式の構文
  66.  ④演算式と環境変数、代入文について
  67.  ⑤その他のコマンドリファレンス
  68.  ⑥マクロ
  69.   ⑦配列の使用
  70.  ⑧CGItools の各ファイルについて
  71.  ⑨注意点とヒント
  72.  ⑩更新状況
  73.  
  74.  
  75. ①CGItools 使用時の設定について
  76.  CGItools は、環境変数を多く使いますので、環境変数領域が広く
  77. 確保されている必要があります。後で述べる post4bat.exe を使用す
  78. る場合は自動的に環境変数領域が確保されますが、そうでない場合は
  79. 環境変数領域を多く確保して使ってください。
  80.  CGItools は、コマンドプロンプトの外部コマンドを使っています
  81. ので、path 指定により、CGItools のディレクトリを指定する必要が
  82. あります。これには、call setpath コマンドを使います。もちろん、
  83. autoexec.bat 等により、あらかじめ path 指定しておいてもかまい
  84. ません。
  85.  CGItools のコマンドの多くは、環境変数 TMPFILE0 で指定される、
  86. 拡張子に「.bat」を持つテンポラリファイルを必要とします。これは、
  87. post4bat.exe により自動的に確保されますが、post4bat.exe を使
  88. わない場合、注意が必要です。
  89.  
  90.  
  91. (CGItools の、CGI における設定例)
  92.  ここでは、次のような環境下で CGItools を用いた CGI を構築する
  93. こととします。
  94.  
  95. ・実行したいバッチは、test.bat であり、c:\httpd\cgi-bin フォルダに
  96. 存在する。
  97. ・HTTP における CGI アドレスは、http://(hostname)/cgi-bin/ である。
  98. ・CGItools は、c:\cgitools フォルダに存在する。
  99.  
  100.  まず、post4bat.exe または p4b-vb.exe(注)を、c:\httpd\cgi-bin 
  101. フォルダにコピーし、ファイル名を test.exe と書き換えます。
  102.  次に、test.bat の先頭部分を次のようにします。
  103.  
  104.   @echo off
  105.   call c:\cgitools\setpath
  106.   exmain %0 %1
  107.  
  108.  これで、test.bat による CGI が可能です。アドレスは、
  109. http://(hostname)/cgi-bin/test.exe になります。ここで使用した、
  110. post4bat.exe, exmain ステートメントについてはこの項の説明を、
  111. setpath ステートメントについては⑤その他のコマンドリファレンス
  112. の項を参照してください。
  113.  
  114.  (注)post4bat.exe と p4b-vb.exe の使い分けについて
  115.   post4bat.exe と WWW サーバプログラムの相性の問題で、
  116.  post4bat.exe を書き換えて使用した場合に動作しない場合が有ります。
  117.  Windows NT に 付属の WWW サーバ(peer web service 等)がその例で
  118.  す。このような場合、p4b-vb.exe をコピーし、書き換えて使用してく
  119.  ださい。この場合、post4bat.exe が CGI のディレクトリに存在するか、
  120.  post4bat.exe にパス指定されている事が必要です(パス指定の方をお
  121.  勧めします)。また、Visual Basic runtime 4 がインストールされてい
  122.  る必要があります。
  123.  
  124.  
  125. post4bat.exe について
  126.  バッチファイルで 標準入力の取り扱いを可能にします。このコマ
  127. ンドはファイル名を書き換えて使用します。使用するバッチファイ
  128. ルのファイル名が、cgibatch.bat の場合、post4bat.exe を同じディ
  129. レクトリにコピーして、ファイル名を cgibatch.exe に書き換えま
  130. す。cgibatch.bat の中では、標準入力 (CGI で POST されたデータ)
  131. は、%1 で示されるファイルの内容を参照することで読み出すことが
  132. できます。
  133.  post4bat.exe は、4つのテンポラリファイルを作成し、そのファイ
  134. ル名を環境変数 TEMPFILE0, TEMPFILE1,TEMPFILE2, TEMPFILE3 とし
  135. て与えます。このうち TEMPFILE0 は拡張子が .bat のファイルであ
  136. り、CGItools の各ルーチンが使用します。バッチファイルベースの 
  137. CGItools のみがこの TEMPFILE0 で示されたテンポラリファイルの内
  138. 容を破壊することを念頭に置いておけば、ユーザもこのテンポラリ
  139. ファイルを使用可能です。TEMPFILE1, TEMPFILE2, TEMPFILE3 はユー
  140. ザが自由に使用可能です。また、%1 で示されるファイルも、POST さ
  141. れた内容を参照した後ならば、テンポラリファイルとして使用可能で
  142. す。これらすべてのテンポラリファイルは、プログラム終了後 
  143. post4bat.exe が消去しますので、ユーザが消去しないようにしてく
  144. ださい。
  145.  また、post4bat.exe 起動時に指定された %1-%9 (あるいはそれ以降)
  146. のコマンドラインは、バッチファイルの %2 以降に引き渡されます。
  147.  
  148.  
  149. exmain ステートメントについて
  150.  このステートメントをバッチファイルの先頭部分におくと、C 言語
  151. と同様な if, while, do-while, for 文が使えます。詳しくは、②拡
  152. 張機能を参照してください。
  153.  
  154.  
  155.  
  156. ②拡張機能(if, while, do-while, for 文)
  157.  if, while, do-while, for を、C と同じように使えます。この拡張
  158. 機能を使用するために、
  159.  
  160. ・バッチファイルの先頭に exmain ステートメントを挿入する
  161. ・コンパイラを使う
  162.  
  163. という、2つの方法があります。
  164.  
  165. 1)exmain ステートメントを挿入するとき
  166.  次の例のように CGItools ディレクトリを path 指定した後の行に、
  167. exmain ステートメントを入れてください。exmain ステートメントは、
  168. 必ず行の最初(左端)に置いてください。動作原理については、「⑦
  169. CGItools の 各ファイルについて」を参照してください。
  170.  
  171. (使用例)拡張バッチファイルのヘッダを次のようにします。この例で
  172. は、CGItools が、c:\cgitools ディレクトリにあるとします。
  173.  
  174.   @echo off
  175.   call c:\cgitools\setpath
  176.   exmain %0 [%1 [%2 [%3 [%4 [%5 [%6 [%7 [%8 [%9]]]]]]]]]
  177.  
  178.  exmain ステートメント行の %0 は、必ず入れます。%1 - %9 は、
  179. バッチファイル中で参照することがある時、必要に応じて入れます。
  180. %9 以降のコマンドラインを参照する必要があるときは、次に述べる
  181. コンパイラを使うか、「⑧ヒント」の項を参照してください。
  182.  
  183. 2)コンパイラを使う
  184.  もう一つの方法として、実行前にコンパイルしておくやり方がありま
  185. す。コンパイルするときは、
  186.  
  187. compile ソースファイル名 [オブジェクトファイル名]
  188.  
  189. とします。ソースファイルの先頭には必ず exmain ステートメントを入
  190. れておきます。また、exmain ステートメント以前の行はスキップされる
  191. ので、ここに注釈行を入れることが可能です。
  192.  
  193. (使用例)ソースバッチファイルのヘッダを次のようにします。
  194.  
  195.   このバッチは拡張機能を使っています。
  196.   ここに注釈行を挿入可能です。
  197.   exmain
  198.   @echo off
  199.   call c:\cgitools\setpath
  200.  
  201.  
  202. (文法について)拡張 if, while, do-while, for の文法は次の通りで
  203. す。なお、従来通りの if, for も使えます。
  204.  
  205. if (条件式) コマンド
  206. [else if (条件式) コマンド]
  207. [else if (条件式) コマンド]
  208. [else if (条件式) コマンド]
  209. [else コマンド]
  210.  (条件式)が真ならば、直後のコマンドを、そうでないならば else 直後の
  211. コマンドを実行します。else と if の間にはスペースを入れてください。
  212.  
  213. while (条件式) コマンド
  214.  (条件式)が真ならばその間、コマンドの実行を続けます。
  215.  
  216. do コマンド
  217. while (条件式)
  218.   一度コマンドを実行し、(条件式)が真ならばその間そのコマンドの実行
  219. を続けます。
  220.  
  221. for (初期化式;条件式;変更式) コマンド
  222.  初期化式を実行し、条件式が真ならば、コマンドおよび変更式の実行を
  223. 続けます。
  224.  
  225. コマンドが2行以上にわたるときは、次のように書きます。
  226.  
  227. if (条件式) {
  228.   コマンド
  229.   コマンド
  230. }
  231.  
  232. if (条件式) {
  233.   コマンド
  234.   コマンド
  235. } else if (条件式) {
  236.   コマンド
  237.   コマンド
  238. } else {
  239.   コマンド
  240.   コマンド
  241. }
  242.  
  243. while (条件式) {
  244.   コマンド
  245.   コマンド
  246. }
  247.  
  248. do {
  249.   コマンド
  250.   コマンド
  251. } while (条件式)
  252.  
  253. for (初期化式;条件式;変更式) {
  254. コマンド
  255. コマンド
  256. }
  257.  
  258. この時、「{」記号は、次の行の先頭に書いてもかまいません。
  259.  
  260.  
  261. また、次のような使い方も可能です。
  262. if (条件式) コマンド
  263. else {
  264. コマンド
  265. コマンド
  266. }
  267.  
  268. if (条件式) {
  269. コマンド
  270. コマンド
  271. } else コマンド
  272.  
  273. ただし、次のような使い方はできません。
  274. if (条件式)
  275.   コマンド
  276.  
  277. while (条件式)
  278.   コマンド
  279.  
  280. for (初期化式;条件式;変更式)
  281.   コマンド
  282.  
  283.  
  284. ③条件式の構文
  285.  拡張 if, while, do-while 文の条件式は、「(」「)」で囲みます。
  286. 拡張 for 文の場合、「;」で囲みます。次の条件式が使えます。この表で
  287. は、優先順位が高い方から書かれてあります。優先順位を変更するときは、
  288. 「(」「)」で囲みます。
  289.  
  290. 条件式            意味
  291. --------------------------------------------------------------
  292. exist 文字列    文字列で示されるファイルが存在するとき、真
  293. 式1<式2    式1の結果が式2の結果より小さい時、真
  294. 式1<=式2    式1の結果が式2以下の時、真
  295. 式1>式2    式1の結果が式2より大きい時、真
  296. 式1>=式2    式1の結果が式2以上の時、真
  297. 式1==式2    二つの式の結果が同じ時、真
  298. 式1!=式2    二つの式の結果が異なる時、真
  299. !条件1        条件1でない時、真
  300. 条件1&&条件2    条件1と条件2の両方が真のとき、真
  301. 条件1||条件2    条件1と条件2のどちらかが真のとき、真
  302. --------------------------------------------------------------
  303.  
  304.  ここで式として、文字列型演算式か整数型演算式のいずれかが使えます。
  305. 書式は「④演算式と環境変数、代入文について」で述べる、call sting ス
  306. テートメント、あるいは call int ステートメントと同じです。「<」「<=」
  307. 「>」「>=」による比較はすべて整数型での比較とみなされます。
  308.  浮動小数点型の数値を比較したいときは、call string ステートメントと
  309. 同様に (float) ステートメントを使います。式1または式2が (float) ス
  310. テートメントを含むとき、「<」「<=」「>」「>=」による比較は浮動小数点
  311. 型での比較とみなされます。このとき、10 桁に丸められて比較されます。
  312.  これらの論理演算子の優先度はすべて、「④演算式と環境変数、代入文に
  313. ついて」で述べる算術演算式の優先度よりも低くなります。
  314.  文字列の表記については「④演算式と環境変数、代入文について」の項の、
  315. call string ステートメントの表記に従います。
  316. (使用例)
  317.   if (%i%<=10) print "i は10以下です"
  318.   for (set i=1;%i%<=5;call int i=%i%+1) echo %i%
  319.   if ((float)(%a%-%b%)<(float)0.1) print "a と b の差は 0.1 未満です"
  320.   if ("123"+file"text.txt"=="123456") echo 結果は真です
  321.   if ("123"+file"text.txt"!="123456") echo 内容が一致していません
  322.   if (!(%i%==1 || %j%==1) && %a%=0) echo aは0で、iもjも1以外です  
  323.  
  324.  
  325. ④演算式と環境変数、代入文について
  326.  CGItools では、環境変数を、文字列型(string)、整数型(int)、浮動小
  327. 数点型(float)として扱うことが可能です。文字列型は、1024 bytes まで
  328. の長さが扱えます。
  329.  
  330. 型名    バイト数    値の範囲
  331. ----------------------------------------
  332. string    < 1024 bytes       -
  333. int    (4 bytes)    -2,147,483,648~
  334.             2,147,483,647
  335. float    (8 bytes)    1.7e +/-308 (15桁)
  336. ----------------------------------------
  337.  
  338.  float 型は、理論的には 15 桁 の精度ですが、環境変数への代入と演算
  339. を繰り返すと誤差が蓄積するので、10 桁を精度の目安としてください。
  340.  
  341.  環境変数を、おのおのの型として用いる場合、call string, call int, 
  342. call float  ステートメントを使います。call xxxx ステートメントの書
  343. 式は次の通りです。
  344.  
  345. call string 環境変数名=文字列 [+ 文字列] [+ 文字列]・・・
  346.  
  347.  文字列を加算した結果を与えます。文字列の加算では、左側の文字列の
  348. 右端に、右側の文字列が追加されます。
  349.  
  350.  文字列としては、次のいずれかが使えます。
  351.  
  352. 書式                解説
  353. ------------------------------------------------------------
  354. "文字列"            「"」で囲んだ中身
  355. exec 文字列            文字列の示すコマンドの実行結果
  356. file 文字列            文字列の示すファイルの内容
  357. funcXXXX(文字列 [パラメータ])    文字列をXXXXコマンドに標準入
  358.                 力として与えたときの実行結果
  359. char(int 型数値演算式)        int 型数値演算結果をアスキー
  360.                 コードとする文字
  361. hex(int 型数値演算式)        int 型数値演算結果の 16 進数表記
  362. (int)(int 型数値演算式)        int 型数値演算結果の 10 進数表記
  363. (float)(float 型数値演算式)    float 型数値演算結果の 10 進数表記
  364.                 ( 10 桁に丸められる)
  365. (文字列+文字列+・・・+文字列)    文字列の加算
  366. ------------------------------------------------------------
  367.  
  368.  「char (数値演算式)」では、s-jis 漢字コードも使用できます。
  369. int, float 型数値演算については次の項を参考にしてください。
  370.  char, hex, (int), (float) に続けて単一の数値を入れる場合、括弧は
  371. 必要ありませんが、演算式を書くときは括弧を使わないとエラーになりま
  372. す。
  373.  exec "コマンド" の書式およびステートメント中で環境変数を変化させ
  374. た場合の規則については、「⑤その他のコマンドリファレンス」で述べる 
  375. exec コマンドと同じです。
  376. (使用例)
  377.   call string t="123"
  378.   call string t="123?n;456"
  379.   call string str=exec "dir test.txt"
  380.   call string str="He said as follows.?n;" + file "mail.txt"
  381.   call string jistext=funcNkf("これは jis コードです" /s /j)
  382.   call string text="a+bは10進数で"+(int)(%a%+%b%)+"16進数で"+hex(%a%+%b%)
  383.   call string text="aとbの差は、"+(float)(%a%-%b%)+"です"
  384.  
  385.   exec, file, funcXXXX は、組み合わせて使用可能です。たとえば、
  386.  
  387.   string t=funcNkf(exec file "test.txt" /s /j)
  388.  
  389.  とすると、ファイル test.txt の内容を、実行し、その結果を nkf コマ
  390. ンドにより s-jis から jis コードに変換します。結果を環境変数 t に
  391. 代入します。
  392.  
  393. (エスケープ配列)
  394.  文字列中の記号は、次の表にしたがって、エスケープ配列に変換され
  395. ます。また、"文字列" は、エスケープ配列を使って表されたものとして
  396. 扱われます。文字列は、このエスケープ配列を用いて表記したときに、そ
  397. の長さが 1024 bytes 以下にならなければなりません。エスケープ配列を
  398. 含む文字列は、print コマンドを使うことによって元の文字列の形で表示
  399. 可能です。
  400.  
  401.     記号        エスケープ配列
  402. ----------------------------------------
  403.     改行         ?n;
  404.      "         ?q;
  405.      |         ?o;
  406.      <         ?l;
  407.      =          ?e;
  408.      >         ?g;
  409.      ?          ??;
  410.      %        ?p;
  411.     10進アスキー    ?#数字;
  412.     16進アスキー    ?#x数字;
  413. -----------------------------------------
  414.  
  415.  
  416. call int 環境変数名=数値演算式
  417. call float 環境変数名=数値演算式
  418.  
  419.  数値演算をそれぞれの型として計算し、環境変数に代入します。使用可
  420. 能な演算子、及び優先順位は、次の通りです。
  421.  
  422. 記号            名前または意味
  423. --------------------------------------------------------
  424. ()            かっこ、優先順位を変更
  425. asc 文字列        文字列の先頭の 1 byte をアスキーコードに変換
  426. wasc 文字列        文字列の先頭の1文字(漢字を含む)をアスキー
  427.             コードまたは漢字コードに変換
  428. val 文字列         文字列を数値に置換
  429. (int)整数型        次の演算式を整数型で計算
  430. (float)浮動小数点型    次の演算式を浮動小数点型で計算
  431. int浮動小数点型        整数に変換
  432. not            ビットごとの NOT
  433. *            乗算
  434. /            除算
  435. %%            剰余
  436. +            加算
  437. -            減算
  438. and            ビットごとの AND
  439. nor            ビットごとの NOR
  440. or            ビットごとの OR
  441. --------------------------------------------------------
  442.  16 進数定数は、「0xdd」(dd は、16 進数)で表記します。その他の場
  443. 合、10 進数とみなされます。8 進数は使えません。結果はすべて 10 進数
  444. 表記で環境変数に代入されます。
  445.  ここでいう文字列は、string 型のところでのべたものと同じです。括弧
  446. で囲むことで、文字列同士の加算を含めることができます。
  447.  funcXXXX( ) を使用するには、val funcXXXX( ) の様に記述します。
  448.  
  449.  
  450. ⑤その他のコマンドリファレンス
  451.  この項では、次のコマンドについて説明します。
  452.  
  453. 書式            略解
  454. -------------------------------------------------------------
  455. echoqs            環境変数 QUERY_STRING の内容を表示します
  456. end            バッチファイルから抜け出します
  457. escape            ISO-Latin または、CGI 形式にエンコードします
  458. exec            コマンドを実行します
  459. exmain            拡張コマンドを含むバッチを実行します
  460. find            文字列を含む行を表示します
  461. head            ファイルの先頭部分を表示します
  462. left            ファイルの各行の左側を表示します
  463. length            ファイルの長さを表示します
  464. nop            バイナリファイルの内容を表示します
  465. now            現在の日付や時刻を表示します
  466. nkf            s-jis, EUC, JIS 間で漢字コードを変換します
  467. occupy            ファイルの独占的使用権を得ます
  468. paste            複数のファイルの各行を連結します
  469. pickup            CGI コードから必要部分を抜き出します
  470. print            文字列を表示します
  471. rcode            改行コードの変換を行います
  472. right            ファイルの各行の右側を表示します
  473. rmvtag            HTML タグを消去します
  474. tail            ファイルの末尾部分を表示します
  475. unescape        ISO-Latin または、CGI 形式をデコードします
  476. wait            一定時間、実行を停止します
  477. call absolute        相対パス指定を、絶対パス指定に変換します
  478. call execute        コマンドを実行します
  479. call float        float 型の演算、代入を行います
  480. call int        int 型の演算、代入を行います
  481. call prints        string 型の演算結果を出力します
  482. call setpath        CGItools へのパス指定を行います
  483. call string        string 型の演算、代入を行います
  484. call tempfile        テンポラリファイルを作成します
  485. -------------------------------------------------------------
  486. 注)call で始まるコマンドは、環境変数の操作のために使われます。
  487.  
  488.  
  489. echoqs
  490.  環境変数 QUERY_STRING の内容を表示します。与えるパラメータは
  491. ありません。
  492.  
  493.  
  494. end
  495.  現在実行中のバッチファイルの実行を停止します。call ステートメ
  496. ントにより他のバッチファイルから呼び出されて実行していた場合は、
  497. 呼出元の親バッチファイルに制御を戻します。CGItools を使うときは
  498. exit コマンドではなく、end コマンドを使うようにします。
  499.  
  500.  
  501. escape [/c] [ファイル名]
  502.  アスキー文字列を ISO Lathin 1アスキー形式(パラメータ無しの
  503. とき)または、CGI エンコード形式(パラメータに /C を指定したと
  504. き)にエンコードします。ISO Lathin 1アスキー形式の場合、空白文
  505. 字 は「%20」にエンコードされ、CGI 形式の場合、空白文字は「+」
  506. に、「+」は「%2B」に、「/」は「%2F」にエンコードされます。その
  507. 他のエンコードの形式は、ISO Lathin 1アスキー形式と CGI 形式で
  508. 同じです。
  509. (使用例)
  510.   escape normal.txt > isol1.txt
  511.   escape /c normal.txt > cgi.txt
  512.  
  513.  
  514. exec 文字列1 [文字列2] [文字列3] [文字列4] ・・・
  515.  文字列の内容を実行します。文字列の書式は、print と同じです。文字
  516. 列中に「?n;」を挿入することにより、2つ以上のコマンドを実行可能です。
  517. 実行により環境変数の値は変化せず、元の値が保存されます。途中の行で
  518. 変化させても次の行には元に戻っているので注意してください。環境変数
  519. を変化させたいときは、call execute を使ってください。また、文字
  520. 列中のコマンドを順次実行していくだけなので、goto 文、拡張 if, 
  521. while, do, for 文は使えません。これらを使うときも、call execute 
  522. を用います。windows 標準の if, for 文は使えます。
  523. (使用例)
  524.   exec "echo 123?n;" "echo 456?n;"
  525. (実行結果)
  526.   123
  527.   456
  528.  
  529. exmain %0 [%1 [%2 [%3 [%4 [%5 [%6 [%7 [%8 [%9]]]]]]]]]
  530.  このコマンドについては、②拡張機能(if, while, do-while, for 文)を
  531. 参考にしてください。
  532.  
  533.  
  534. find 文字列 [/v] [/c] [/n] [/i] [/l] [/s] [/r] [ファイル名]
  535.  ファイル中の、文字列を含む行を表示します。文字列の書式は、print 
  536. と同じです。各スイッチの意味は次の通りです。
  537.  /I アルファベットの大文字小文字の区別をしません
  538.  /V 文字列を含まない行を表示します
  539.  /C 文字列を含む行の行数を表示します
  540.  /N 行番号を表示します
  541.  /L 文字列を含む行の、文字列の左側を表示します
  542.  /S 文字列を含む行の、文字列そのものを表示します
  543.  /R 文字列を含む行の、文字列の右側を表示します
  544. なお、/L,/S,/R のどれも指定しないときは、すべて指定したときと同じで、
  545. 行すべてが表示されます。ファイル名を指定しないときは、標準入力に対し
  546. て検索を行います。
  547. (使用例)
  548.   dir | find "<DIR>"
  549.  
  550.   find :text1?q; /r %0
  551.   :text1"表1<BR>
  552.   :text1"<TABLE><TR><TD>名前</TD><TD>電子メール</TD></TR>
  553.   :text1"<TR><TD>Aさん</TD><TD>name@address.com</TD></TR></TABLE>
  554.  
  555.  
  556. head [-xxxxx | +xxxxx] [ファイル名]
  557.  ファイルの先頭部分を表示します。パラメータに「-xxxxx」(xxxxx は
  558. 0 以上の 10 進数整数)を指定した場合、先頭の xxxxx 行を、「+xxxxx」
  559. を指定した場合、末尾の xxxxx 行を除いた先頭部分を表示します。パラ
  560. メータを与えない場合、デフォルトとして「-10」が使われます。ファイ
  561. ル名を省略すると、標準入力に対して操作を行います。
  562.  
  563.  
  564. left [-xxxxx | +xxxxx] [/w] [ファイル名]
  565.  ファイルの各行の、左側を表示します。パラメータに「-xxxxx」(xxxxx 
  566. は 0 以上の 10 進数整数)を指定した場合、左から xxxxx 文字を、「+xxxxx」
  567. を指定した場合、末尾の xxxxx 文字を除いた左側を表示します。/w を
  568. 指定すると、s-jis 漢字を1文字として認識します。ファイル名を省略
  569. すると、標準入力に対して操作を行います。
  570.  
  571.  
  572. length [/l | /e] [/w] [ファイル名]
  573.  ファイルの長さを10進数で表示します。パラメータに /L を与えると
  574. 行数を、/E を与えると各行の文字数を、どちらも与えない場合ファイル
  575. 全体の大きさ(バイト数または文字数)を表示します。また、パラメータ
  576. に /W を与えると、s-jis 漢字全角文字を一文字として認識します。/W 
  577. を与えない場合、全角文字は、2 bytes として、計算します。ファイル名
  578. を与えないときは、標準入力のファイルについて計算します。
  579.  
  580.  
  581. math /関数 [ファイル名]
  582.  標準入力で与えた数値をそれぞれの関数で処理して、出力します。この
  583. コマンドは、バッチファイルのヘッダに :define <math.h> と指定して、
  584. exmain ステートメント後の call float ステートメントの中で使うのが普
  585. 通です。ファイル名を指定したときは、ファイルの内容が示す数値について
  586. 計算します。
  587.  
  588.                 <math.h> を指定
  589. パラメータ    意味        したときの使用法    備考
  590. ---------------------------------------------------------------------
  591. /abs        絶対値        abs(数値)
  592. /pow        2つの値    pow(数値1,数値2)    コマンドラインで使用
  593.         のべき乗                するときは2つの数値
  594.                             を「,」で区切る。
  595. /exp        指数関数    exp(数値)
  596. /sqrt        平方根        sqrt(数値)
  597. /ln        自然対数    ln(数値)
  598. /log        常用対数    log(数値)
  599.  
  600. /sin        サイン        sin(数値)
  601. /cos        コサイン    cos(数値)
  602. /tan           タンジェント    tan(数値)
  603. /asin        アークサイン    asin(数値)
  604. /acos        アークコサイン    acos(数値)
  605. /atan        アークタンジェント    atan(数値)
  606. /sinh        ハイパーボリックサイン    sinh(数値)
  607. /cosh        ハイパーボリックコサイン    cosh(数値)
  608. /tanh       ハイパーボリックタンジェント    tanh(数値)
  609.  
  610. /rand        擬似乱数    rand(数値)        0以上「数値」未満の
  611.                             乱数を得る。数値を省
  612.                             略すると0以上1未満。
  613.  
  614. (該当無し)    円周率        PAI            3.14159265358979 を
  615.                             与える
  616. ---------------------------------------------------------------------
  617. コマンドラインで使用するときは、
  618.   echo %x% | math /sin
  619.   echo %x1%,%x2% | math /pow
  620. の様に使用し、call float ステートメントでは、
  621.   call float y=cos(%x%)             (:include <math.h> を指定したとき)
  622.   call float y=valFuncMath((float)(%x%) /cos)         (指定しないとき)
  623.   call float y=valFuncMath(((float)(%x1%)+","+(float)(%x2%)) /pow)
  624.                                                       (指定しないとき)
  625. の様に使用します。
  626.  
  627.  
  628. nop [ファイル名]
  629.  ファイルの内容を変更することなく表示します。type コマンド
  630. と異なり、バイナリファイルについてもファイルの全領域を出力し
  631. ます。ファイル名を省略すると、標準入力の内容を表示します。
  632. (使用例)
  633.   nop application.exe
  634.  
  635.  
  636. now [[/d] [/t] | 文字列] [/j | /e] [+XXXXX | -XXXXX]
  637.  現在の時刻または日付を表示します。/d を指定すると、所定の書式で今日
  638. の日付を、/t を指定すると現在の時刻を表示します。/d /t の両方を指定す
  639. ることもできます。文字列を指定すると、その文字列の中に日付や時刻の表記
  640. を埋め込むことができます。文字列における書式は print と同様で、表のよ
  641. うにコードが変換されます。/j を指定すると日本語表記で、/e を指定すると
  642. 英語表記で表示します。デフォルトは日本語表記です。パラメータに /e だけ
  643. または /d /t /e を指定すると、インターネットで使われている表記に最も近
  644. い表示がされます。
  645.  パラメータに +XXXXX または、-XXXXX (XXXXX は10進数整数)を指定する
  646. と、それぞれ現在より XXXXX 秒後、または XXXXX 秒前の時刻・日付について
  647. 表示されます。
  648.  
  649.  
  650.     変換後の表示  変換前のコード    備考
  651. ----------------------------------------------------------
  652.     西暦(4桁)    ?yyyy;
  653.     西暦(下2桁)    ?yy;
  654.     月        ?mm;        英語の場合、省略形
  655.     日        ?dd;
  656.     [0]西暦(下2桁)    ?yyy;        一桁のとき、0 を付加。
  657.     [0]月        ?mmm;        英語の場合、フルスペル
  658.     [0]日        ?ddd;        一桁のとき、0 を付加。
  659.  
  660.     曜日(省略形)    ?ww;
  661.     曜日(フルスペル)    ?www;
  662.  
  663.     時        ?th;
  664.     分        ?tm;
  665.     秒        ?ts;
  666.     [0]時        ?thh;        一桁のとき、0 を付加。
  667.     [0]分        ?tmm;        一桁のとき、0 を付加。
  668.     [0]秒        ?tss;        一桁のとき、0 を付加。
  669.  
  670.     改行         ?n;
  671.      "         ?q;
  672.      |         ?o;
  673.      <         ?l;
  674.      =          ?e;
  675.      >         ?g;
  676.      ?          ??;
  677.      %        ?p;
  678.     10進アスキー    ?#数字;
  679.     16進アスキー    ?#x数字;
  680. ----------------------------------------------------------
  681.  
  682. (使用例)
  683.   now "今日は、?yyyy;年?mm;月?dd;日 ?www;です。"
  684.   now "現在の時刻は ?th;時?tm;分?ts秒です。"
  685.   now "現在の 10000 秒後は ?th;時?tm;分?ts秒です。" +10000
  686.   now "?ww;, ?dd; ?mm; ?yyyy; ?thh;:?tmm;:?tss; +0900 (JST)" /e
  687.  
  688.  
  689. nkf [/s|/e|/j] [/s|/e|/j] [ファイル名]
  690.  漢字コードを、shift-jis, EUC, JIS 間で変換します。/S, /E, /J のど
  691. れかのパラメータを1つだけ指定した場合、変換前の漢字コードを自動判別
  692. して、s-jis, EUC, または JIS コードに変換します。3つのうち、異なる2
  693. つを指定した場合、最初のパラメータを置換前の漢字コードとみなし、2番
  694. 目のパラメータで指定される漢字コードへ変換します。パラメータを与えな
  695. いとき、自動判別して s-jis に変換します。ファイル名を与えないときは、
  696. 標準入力に対して処理を行います。
  697.  
  698.  
  699. occupy [-XXXXX | /u] ファイル名
  700.  ある特定の事象(ファイル名で示される)の独占的使用権を得ます。他の
  701. バッチが独占的使用権を持っている場合、使用権が開放されるまで待機しま
  702. す。取得した使用権を開放するときは、/U スイッチを指定します。パラメー
  703. タに「-XXXXX」(XXXXX は10進数整数)を指定すると、XXXXX 秒経過して
  704. も他のバッチが使用権を開放しない場合、強制的に使用権の開放を行います。
  705. 「-XXXXX」を指定しない場合、デフォルトとして「-10」が使われます。この
  706. コマンドは、ファイル名で示されるファイルに情報を読み書きすることで動
  707. 作しますので、ファイル名にはユーザが使用していないファイルを指定して
  708. ください。
  709.  
  710. (使用例)掲示板で、ファイルに書き込む場合。
  711.   occupy chgbody
  712.   print "<HR><A HREF=?q;mailto:" >> bodytext.html
  713.   pickup "email" %1 | unescape /c >> bodytext.html
  714.   print "?q;>" >> bodytext.html
  715.   pickup "name" %1 | unescape /c >> bodytext.html
  716.   print "</A><BR><PRE>?n;" >> bodytext.html 
  717.   pickup "text" %1 | unescape /c >> bodytext.html
  718.   print "</PRE>?n;" >> bodytext.html
  719.   occupy /u chgbody
  720.  
  721.  
  722. paste 文字列 [/s] [ファイル名] [ファイル名] [ファイル名]・・・
  723.  ファイルの各行を横に連結します。繋ぎ目には、指定した文字列が使
  724. われます。文字列の書式は、print と同じです。ファイル名に「-」を指
  725. 定すると、指定した位置で標準入力が使用されます。/s を指定すると、
  726. 改行を行わず、一行だけにします。
  727.  
  728.  
  729. pickup 文字列 [/n] [ファイル名]
  730.  デコードされた CGI フォームから、「文字列」 で示された名前を持
  731. つ要素をピックアップし、表示します。該当する要素が2つ以上ある
  732. 時は、2行以上にわたって表示します。パラメータに /N を与えると
  733. 各要素の名前の部分(「name=」)を含めて表示します。ファイル名を
  734. 指定しない場合、標準入力に対して操作を行います。ファイル名を指定
  735. せず、かつ標準入力が無い場合、環境変数 QUERY_STRING に対して操作
  736. を行います。
  737. (使用例)
  738.   pickup text /n %1
  739.   echoqs | pickup text
  740.   pickup text
  741.  
  742.  
  743. print [文字列] [文字列] [文字列] ・・・・・
  744.  文字列を表示します。この時、次の表にしたがって、コードを記号に
  745. 変換して表示します。この変換方法は、「④演算式と環境変数、代入文
  746. について」の所で述べた、call string ステートメントにおける文字列
  747. の変換方法と同じです。従って、call string ステートメントで得られ
  748. た環境変数をそのまま表示させることができます。echo ステートメント
  749. と異なり、最後の改行コードは表示されませんので、適宜「?n;」を挿入
  750. してください。また、空白文字等を表示させたいときは「"」で文字列を
  751. 括ります。なお、call string ステートメントのような、exec "文字列"、
  752. funcXXXX("文字列") 等は、使用できません。
  753.  
  754.     変換後の記号  変換前のコード
  755. ----------------------------------------
  756.     改行         ?n;
  757.      "         ?q;
  758.      |         ?o;
  759.      <         ?l;
  760.      =          ?e;
  761.      >         ?g;
  762.      ?          ??;
  763.      %        ?p;
  764.     10進アスキー    ?#数字;
  765.     16進アスキー    ?#x数字;
  766. -----------------------------------------
  767. (使用例)                                (実行結果)
  768.   print "123?n;4 5 6?c;789??;"              123
  769.                                             4 5 6
  770.                                             789?
  771.  
  772.   print "123?n;" "4 5 6?n;" "789??;"        123
  773.                                             4 5 6
  774.                                             789?
  775.  
  776.   print 123?n;4 5 6?n;789??;                123
  777.                                             456
  778.                                             789?
  779.  
  780.   print "<IMG SRC=?q;image.gif?q;>"         <IMG SRC="image.gif">
  781.  
  782.   print "?#65;?#x2A;"                       A*
  783.  
  784.   @echo off                                 stringA=?l;HR?g;
  785.   call string stringA="<HR>"                stringA=<HR>
  786.   echo stringA=%stringA%
  787.   print "stringA=%stringA%?n;"
  788.  
  789.  
  790. rcode [/c] [/l] [ファイル名]
  791.  改行コードを、Windows 形式 (CR+LF)、Mac 形式 (CR)、Unix 形式 
  792. (LF)、の間で変換します。/C スイッチのみを与えたとき Mac 形式に、
  793. /L スイッチのみを与えたとき Unix 形式に、両方のスイッチを与える
  794. か両方とも与えないときは Windows 形式に変換します。ファイル名を
  795. 省略すると標準入力のテキストに対して変換を行います。
  796.  
  797.  
  798. right [-xxxxx | +xxxxx] [/w] [ファイル名]
  799.  ファイルの各行の、右側を表示します。パラメータに「-xxxxx」(xxxxx 
  800. は 0 以上の 10 進数整数)を指定した場合、右から xxxxx 文字を、「+xxxxx」
  801. を指定した場合、先頭の xxxxx 文字を除いた右側を表示します。/w を
  802. 指定すると、s-jis 漢字を1文字として認識します。ファイル名を省略
  803. すると、標準入力に対して操作を行います。
  804.  
  805.  
  806. rmvtag [/r] [ファイル名]
  807.  HTML のタグを示す4つの記号「<」「>」「&」「"」をそれぞれ、
  808. 「<」「>」「&」「"」に置換して表示します( /R オ
  809. プションを指定しない場合)。ファイル名を与えないときは標準入力
  810. のテキストに対して置換を行います。
  811.  /R オプションを指定すると、逆の動作を行います。つまり、「<」
  812. 「>」「&」「"」を「<」「>」「&」「"」に置換します。
  813. また、アスキーコード表示「 進数;」(「 」「¡」など)
  814. を、文字に置換します。
  815. (使用例)
  816.   unescape /c %1 | rmvtag
  817.   rmvtag text.html
  818.   echo <A HREF="index.html">| rmvtag /r
  819.  
  820.  
  821. tail [-xxxxx | +xxxxx] [ファイル名]
  822.  ファイルの末尾部分を表示します。パラメータに「-xxxxx」(xxxxx は
  823. 0 以上の 10 進数整数)を指定した場合、末尾の xxxxx 行を、「+xxxxx」
  824. を指定した場合、先頭の xxxxx 行を除いた末尾部分を表示します。パラ
  825. メータを与えない場合、デフォルトとして「-10」が使われます。ファイ
  826. ル名を省略すると、標準入力に対して操作を行います。
  827.  
  828.  
  829. unescape [/c] [ファイル名]
  830.  ISO Lathin 1アスキー形式の文字列をアスキー文字列に変換、ま
  831. たはエンコードされている CGI データをデコードします。ISO 
  832. Lathin 1アスキー形式の場合はオプションになにも与えず、 CGI 
  833. データのデコードの場合は、オプションに /C を与えます。つまり、
  834. /C オプションを与えた場合は、「+」を空白文字に置換します。
  835. ファイル名を指定しない場合は、標準入力の文字列に対して変換を
  836. 行います。
  837. (使用例)
  838.   echoqs | unescape /c
  839.   unescape /c %1
  840.   unescape text1.txt
  841.  
  842.  
  843. wait -XXXXX
  844.  XXXXX (10 進数) 秒間、待機して戻ります。
  845.  
  846.  
  847. call absolute 環境変数名 [環境変数名] [環境変数名]・・・
  848.  ディレクトリまたはファイルへのパスを示す環境変数の内容を、
  849. 絶対パス指定に変更します。
  850.  
  851.  
  852. call execute 文字列1 [文字列2] [文字列3] [文字列4] ・・・
  853.  文字列の内容を実行します。文字列の書式は、print と同じです。実行の
  854. 結果、環境変数の値は変化します。環境変数を変化させたくない時は、exec 
  855. を使ってください。
  856.  文字列の内容は、バッチファイルとして実行されます。従って、goto
  857. コマンド等を使って、ループさせることも可能です。拡張 if, while 等を
  858. 使うときは、例を参考にしてください。
  859.  また、環境変数の表記に注意が必要です。環境変数を、%env% の様に表記
  860. した場合と、%%env%% の様に表記した場合、結果が異なる場合があります。
  861. %env% の様に表記した場合は、exec.bat の呼出の際に環境変数の内容が代
  862. 入されて実行されます。%%env%% の様に表記した場合、execute コマンドが
  863. 作成したテンポラリバッチファイル中で環境変数の内容が代入されます。
  864. (使用例)
  865.   @echo off
  866.   set env=123
  867.   call execute "set env=456?n;" "echo env=%env%?n;" "echo env=%%env%%?n;"
  868. (実行結果)
  869.   env=123
  870.   env=456
  871.  
  872.  最初の行に "exmain %%0?n;" を入れると、拡張コマンドが使用可能です。
  873. (使用例)
  874.   @echo off
  875.   call execute "exmain %%0?n;" "for (set i=*;?q;%%i%%?q;!=?q;*****?q;;set i=%%i%%*) echo %%i%%?n;"
  876. (実行結果)
  877.   *
  878.   **
  879.   ***
  880.   ****
  881.  
  882.  
  883. call int 環境変数名=数値演算式
  884.  このコマンドについては、「④演算式と環境変数、代入文について」を
  885. 参考にしてください。
  886.  
  887.  
  888. call float 環境変数名=数値演算式
  889.  このコマンドについては、「④演算式と環境変数、代入文について」を
  890. 参考にしてください。
  891.  
  892.  
  893. call prints 文字列演算式
  894.  call string の書式にしたがって文字列演算式を計算し、出力します。
  895. このコマンドは2次的に call string コマンドを呼び出しているため、
  896. 文字列演算式の結果が 1024 bytes 以内に収まっている必要があります。
  897.  
  898.  
  899. call [ドライブ名][パス名]setpath
  900.  CGItools へのパス指定を行います。また、環境変数 TMPFILE0 が指定
  901. されていないとき、それをカレントディレクトリの tmp.bat に指定し
  902. ます。
  903.  call setpath ステートメントにより環境変数 TMPFILE0 を tmp.bat に
  904. 指定した場合、同じディレクトリにある、CGItools を使用したバッチを、
  905. 複数個同時に実行しないでください。同じテンポラリファイル tmp.bat 
  906. を使用することによる誤動作の可能性があります。post4bat.exe を使用
  907. して自動的に環境変数 TMPFILE0 を設定している場合はこの限りではあり
  908. ません。
  909.  
  910.  
  911. call string 環境変数名=文字列演算式
  912.  このコマンドについては、「④演算式と環境変数、代入文について」を
  913. 参考にしてください。
  914.  
  915.  
  916. call tempfile 環境変数名 [.拡張子] [環境変数名 [.拡張子]]・・・
  917.  読み書き可能なテンポラリファイルのファイル名を作成し、ファイル名
  918. を指定される環境変数に代入します。拡張子を指定するときは、環境変数
  919. 名のあと空白を置いて「.拡張子」の様に記述します。環境変数名として、
  920. 一番目の文字が「.」であるものを指定したい場合は、その環境変数名を
  921. 最初のパラメータとして指定するか、直前のパラメータで、「.拡張子」
  922. を指定しておきます。
  923.  テンポラリファイルは使用後、消去してください。消去しないと使用済
  924. みのテンポラリファイルが蓄積します。
  925.  
  926.  
  927. ⑥ディレクティブ
  928.  CGItools では、post4bat.exe あるいは exmain ステートメント( exmain 
  929. コンパイラ)を使用するとき、特殊な指令(ディレクティブ)が使えます。
  930.  
  931. 1) post4bat.exe が認識するディレクティブ
  932.  
  933.  post4bat.exe が認識するディレクティブは、「:<HEAD>」「:<PATH>」
  934. 「:<PRINTS>」の3種類です。まず、「:<HEAD>」が認識され、続けて
  935. 「:<PATH>」「:<PRINTS>」の順に認識されます。従って、「:<HEAD>」
  936. ステートメントの前に「:<PRINTS>」を書いても、「:<HEAD>」ディレク
  937. ティブの方が先に実行されます。「:<PRINTS>」ディレクティブを使用する
  938. ときは、「:<PATH>」ディレクティブを挿入することが必要です。
  939.  
  940.  
  941. :<HEAD>
  942.  バッチファイルの先頭部分にこのディレクティブを書くことにより、HTTP
  943. ヘッダーを post4bat.exe に送らせることができます。Content-length: を
  944. 指定すると、「:<PRINTS>」ディレクティブの実行結果およびバッチの実行
  945. 結果のバイト数を計算して、自動的に書き込みます。
  946. (使用例)
  947.   @echo off
  948.   :<HEAD>HTTP/1.0 200 OK
  949.   :<HEAD>Content-type: text/html
  950.   :<HEAD>Content-length:
  951.   :<HEAD>
  952.   :<PATH>c:\cgitools
  953.   exmain %0 %1
  954.  
  955.   @echo off
  956.   :<HEAD>HTTP/1.0 200 OK
  957.   :<HEAD>Content-type: text/html
  958.   :<HEAD>
  959.   :<HEAD><HTML><HEAD><TITLE>Test page</TITLE></HEAD><BODY>
  960.   :<PATH>c:\cgitools
  961.   exmain %0 %1
  962.  
  963.  
  964. :<PATH>
  965.  環境変数 PATH に CGItools へのパス指定を追加します。「:<PRINTS>」
  966. を使用するときは必ず指定します。
  967. (使用例)
  968.   :<HEAD>HTTP/1.0 200 OK
  969.   :<HEAD>Content-type: text/html
  970.   :<HEAD>
  971.   :<PATH>c:\cgitools
  972.  
  973. :<PRINTS>
  974.  call prints コマンドの書式にしたがって文字列を処理し、表示します。
  975. call prints コマンドでは使えない、「 > ファイル名」「 >> ファイル名」
  976. によるリダイレクトも可能です。このディレクティブは toolslib.exe を2
  977. 次的に呼び出しているため、「:<PATH>」ディレクティブにより cgitools 
  978. へのパス指定を必ず行ってください。
  979. (使用例)簡易型カウンタの例
  980.   :<HEAD>HTTP/1.0 200 OK
  981.   :<HEAD>Content-type: text/html
  982.   :<HEAD>Content-length:
  983.   :<HEAD>
  984.   :<PATH>c:\cgitools
  985.   :<PRINTS>"<HTML><HEAD><TITLE>訪問者数</TITLE></HEAD><BODY>"
  986.   :<PRINTS>(int)(valFile"count.txt"+1)>count.txt
  987.   :<PRINTS>"あなたは "+(int)valFile"count.txt"+" 人目の訪問者です"
  988.   :<PRINTS>"</BODY></HTML>"
  989.  
  990.  
  991. 2) exmain コンパイラが認識するディレクティブ
  992.  
  993.  exmain ステートメントあるいはコンパイラを使用すると、:include ディ
  994. レクティブと、マクロディレクティブ( :define, :undef )が使えます。
  995.  
  996. :include <ファイル名>|"ファイル名"
  997.  ファイル名で示されたファイルの内容を、挿入します。「<ファイル名>」
  998. の様に表記した場合、環境変数 PATH の内容にしたがってファイルを検索
  999. し、挿入します。「"ファイル名"」の様に表記した場合、相対パス指定な
  1000. らばカレントディレクトリからの相対指定でファイルを検索し、挿入しま
  1001. す。
  1002. (使用例)
  1003.   :include <math.h>
  1004.  
  1005.  
  1006. :define "文字列1" "文字列2" [/s] [/a:"文字列3"]
  1007.  文字列1の内容を文字列2に置換します。文字列の表記は、call string
  1008. ステートメントと同じです。文字列の中で「?0;」「?1;」・・・「?9;」と
  1009. 表記される部分は、テキスト中の文字に置き換えられます。文字列1の検
  1010. 索は、アルファベットの大文字小文字を厳密に区別します。/S スイッチ
  1011. を指定すると、「"」で囲まれた文字列の部分も検索し、置換します。/S 
  1012. スイッチを指定しないときは、「"」で囲まれた文字列の部分は置換の対象
  1013. になりません。/A: スイッチを指定すると、文字列3が存在する行の、文
  1014. 字列3以降が検索・置換の対象となります。文字列3については、大文字
  1015. 小文字の区別をしません。
  1016.  文字列1において、「?0;」「?1;」・・・「?9;」の部分とみなされるの
  1017. は「(」「)」で囲まれた式、「"」で囲まれた文字列、あるいはそれらを含
  1018. む文字列です。また、文字列1中で「?0;」「?1;」・・・「?9;」の直後に
  1019. 「(」「"」を使うことはできません。
  1020.  :define ディレクティブは、後に指定されたものが、先に処理されます。
  1021.  
  1022. (使用例)
  1023.   :define "sin(?1;)" "valFuncMath((float)(?1;)/sin)" /a:"float"
  1024.   :define "PAI" "3.14159265358979"
  1025.  
  1026.  
  1027. :undef "文字列"
  1028.  :define で定義されたマクロ定義を、解除します。
  1029.  
  1030.  
  1031. ⑦配列の使用
  1032.  CGItools では、特に配列の使用は定義していませんが、次のようにす
  1033. れば一次元、多次元配列が使えます。
  1034.  配列を用いる時は、exec ステートメントあるいは、call execute ス
  1035. テートメントを使います。次のようにすれば、環境変数 st に、配列 
  1036. t()の 環境変数 a 番目の要素を代入できます。
  1037.  
  1038.   call execute "call string st=%%t(%a%)%%"
  1039.  
  1040.  配列の要素に、値を代入したい時は、次の例のようにします。
  1041.  
  1042.   call int i(%a%)=数値演算式
  1043.  
  1044.  多次元配列は、次の例のように使用することができます。
  1045.  
  1046.   call execute "call float v=%%d(%a%,%b%)%%"
  1047.  
  1048.  環境変数を変化させないときは、exec コマンドも使えます。
  1049.  
  1050.   exec "echo %%d(%a%,%b%)%%"
  1051.  
  1052.  次の例では、整数値を持つ配列 i( ) の %a% 番目の要素を環境変数 j 
  1053. に代入します。
  1054.  
  1055.   call int j=val exec "echo %%i(%a%)%%"
  1056.  
  1057.  
  1058. ⑧CGItools の各ファイルについて
  1059.  CGItools に含まれている exe ファイルはすべて、C++ で書かれており、
  1060. Micro Soft Visual C++ ver 4.0 standard edition を用いてコンパイル
  1061. しました。C++ で書いたといっても、ほとんど C の機能を用いています。
  1062. また、製作者が C で書いた初めてのプログラムなので、効率の悪い部分や
  1063. 変な部分もあると思います。「ここは変だ」というようなところがあれば、
  1064. 指摘していただければ嬉しいです。
  1065.  CGItools は、「⑤その他のコマンドリファレンス」で述べた実行型
  1066. ファイル (*.exe) の他に、次のファイルを含みます。
  1067.  
  1068. ファイル名        備考
  1069. ------------------------------------------------------------------
  1070. exmain.bat        exmain ステート認識用
  1071.  
  1072. compile.bat        exmain コンパイラの実行用
  1073.  
  1074. timer.bat        CGItools を用いた、タイマープログラム
  1075.  
  1076. その他のバッチファイル    環境変数操作のためのコマンド用
  1077.  
  1078. math.h            各種関数のマクロ定義を含むヘッダファイル
  1079.  
  1080. toolslib.exe        演算ルーチン、コンパイルルーチン等を含む
  1081.  
  1082. Readme.txt        あなたが現在お読みの、テキストファイル
  1083.  
  1084. source.zip        C++ ソースの、圧縮ファイル
  1085. ------------------------------------------------------------------
  1086.  
  1087.  
  1088. ⑨注意点とヒント
  1089.  ここでは次の項目について述べます。
  1090.  
  1091.  1)スピードアップのために
  1092.  2)exmain ステートメントを使うか、コンパイラを使うかの選択
  1093.  3)1行の文字数が長い(1024 bytes 以上)ファイルの取り扱い
  1094.  4)改行コードの認識
  1095.  5)Windows NT 4.0 を使うときの注意
  1096.  
  1097.  
  1098. 1)スピードアップのために
  1099.  CGItools を CGI に用いる場合、よほど複雑な計算やループ処理を
  1100. 行わない場合、その速度はインターネットでのアクセスの速度を考え
  1101. るとそれほど遅くないと思われます。しかし、複雑な計算をさせたり、
  1102. ループ処理を行わせたりするとその処理速度の遅さが支障をきたす場
  1103. 合があります。これは、Windows NT より、Windows 95 のほうが、顕
  1104. 著に現れます。ここでは、スピードアップのための方法について述べ
  1105. ます。
  1106.  スピードアップの方法を一言で述べると、CGItools のコマンド群の
  1107. 使用頻度をできる限り押さえるということです。Windows 標準の内部
  1108. コマンドをできる限り使うようにします。
  1109.  一つのバッチファイルを例に挙げて説明します。
  1110.  
  1111. (CGItools を使用したバッチファイルの例)
  1112.   @echo off
  1113.   exmain %0
  1114.   echo.|time
  1115.   echo Test1
  1116.   for (set i=1;%i%<=3;call int i=%i%+1) print "%i%?n;"
  1117.   echo.|time
  1118.   echo Test2
  1119.   for (set i=1;%i%<=3;call int i=%i%+1) echo %i%
  1120.   echo.|time
  1121.   echo Test3
  1122.   for (set i=1;"%i%"!="4";call int i=%i%+1) echo %i%
  1123.   echo.|time
  1124.   echo Test4
  1125.   for (set i=1;%i%<=3;set i=%i%+1) echo %i%
  1126.   echo.|time
  1127.   echo Test5
  1128.   for (set i=*;"%i%"!="****";set i=%i%*) echo %i%
  1129.   echo.|time
  1130.  
  1131.  このバッチは、CGItools の拡張 for 文を使って、さまざまな方法で
  1132. 3回のループ処理を行わせるものです。このバッチを、80486-dx4, 
  1133. 100 MHz, Windows 95 で使用すると、実行結果は次のようになります。
  1134.  
  1135. (実行結果)
  1136.   現在の時刻は  14:51:35.17
  1137.   時刻を入力してください:   
  1138.   Test1
  1139.   1
  1140.   2
  1141.   3
  1142.   現在の時刻は  14:51:38.58
  1143.   時刻を入力してください:   
  1144.   Test2
  1145.   1
  1146.   2
  1147.   3
  1148.   現在の時刻は  14:51:41.27
  1149.   時刻を入力してください:   
  1150.   Test3
  1151.   1
  1152.   2
  1153.   3
  1154.   現在の時刻は  14:51:42.70
  1155.   時刻を入力してください:   
  1156.   Test4
  1157.   1
  1158.   1+1
  1159.   1+1+1
  1160.   現在の時刻は  14:51:44.07
  1161.   時刻を入力してください:   
  1162.   Test5
  1163.   *
  1164.   **
  1165.   ***
  1166.   現在の時刻は  14:51:44.24
  1167.   時刻を入力してください: 
  1168.  
  1169.  Test1 は、Cなどと同じように3回ループを表記したものです。3.41 秒
  1170. かかっています。Test2 では、表示のためのコマンドを、CGItools の print 
  1171. から、Windows 標準の内部コマンド echo に置き換えたものですが、2.69 
  1172. 秒と、速度が向上しました。
  1173.  さらに、Test3 では、比較式を、"文字列"!="文字列" の形に変更してい
  1174. ます。exmain コンパイラは、拡張 if, for, do, while 文での分岐で、な
  1175. るべく Windows 標準の if 文を使うようにコンパイルします。この場合、
  1176. Windows 標準の if not "文字列"=="文字列" を使用したオブジェクトにコ
  1177. ンパイルされます。従って、ループ中で CGItools の呼び出しが1回減り
  1178. ますので、実行時間が 1.43 秒と短くなりました。
  1179.  Test4 は、 CGItools の呼び出しを減らすもう一つの例です。1を加算す
  1180. るコマンドは set i=%i%+1 なのですが、実際には環境変数 i に加算の演算
  1181. 式が増えていくだけです。実際の加算は for 文の比較式の %i%<=3 の部分
  1182. で行っています。実行時間は 1.37 秒で、Test2 より速くなりました。
  1183.  最後に Test5 は CGItools の呼び出しを一回も行わずにループさせる例
  1184. です。この場合、実行時間は 0.17 秒になり、速度が飛躍的に向上している
  1185. のが分かります。ちなみに、exmain コンパイラによるオブジェクトバッチ
  1186. の Test5 の部分は次の通りです。
  1187.  
  1188.   echo.|time
  1189.   echo Test5
  1190.   set i=*
  1191.   goto :LBL00009
  1192.   :LBL00010
  1193.   echo %i%
  1194.   set i=%i%*
  1195.   :LBL00009
  1196.   if not "%i%"=="****" goto  :LBL00010
  1197.   echo.|time
  1198.  
  1199.  
  1200. 2)exmain ステートメントを使うか、コンパイラを使うかの選択
  1201.  CGItools の拡張コマンドを使用する際一つの方法として、exmain 
  1202. ステートメントをバッチファイルの最初に置きますが、この場合、実
  1203. 行毎にコンパイルを行っています。exmain ステートメントによるコン
  1204. パイルに要する時間は、Cなどでコンパイルに要する時間に比べて短
  1205. いので、通常の使用ではバッチファイルの先頭に exmain %0 ステート
  1206. メントを書いておく方法で問題は起きないと思われます。ただし、
  1207. :define ディレクティブの量が増えるとコンパイルに時間がかかり、
  1208. 場合によっては数秒を要する場合があります。特に、:include <math.h> 
  1209. を指定すると、math.h ファイルに多くの :define ディレクティブが
  1210. 存在するため、このような問題が生じます。従って、:include <math.h> 
  1211. を使用するかいなかを一つの目安として、使用している場合、試しに 
  1212. compile コマンドによりコンパイルを行ってみて、コンパイルに要す
  1213. る時間を測定するとよいでしょう。その時間が長すぎて支障をきたす
  1214. と思われる場合にのみ、あらかじめ compile コマンドでコンパイルし
  1215. て使用する様にします。
  1216.  
  1217.  
  1218. 3)1行の文字数が長い(1024 bytes 以上)ファイルの取り扱い
  1219.  一般に提供されているファイル操作ツール群では、1行の文字数が
  1220. 長いファイルを扱うと、末端部分の文字が認識されないなどの誤作動
  1221. を起こすことがあります。1行が 1024 bytes 以上になるとこのよう
  1222. な誤作動を起こす場合が多いようです。
  1223.  CGItools では、1行の文字数が多くなってもこのような誤作動は
  1224. 起こしません。ただし、ファイルの長さが 2G bytes を超えると誤作
  1225. 動する可能性がありますが、そのような大きなファイルを扱うことは
  1226. まず無いでしょう(Windows 95 では、このようなファイルは取り扱い
  1227. 不可能です)。
  1228.  ただし、注意しなければならないのは、call string ステートメン
  1229. トを使うときで、この場合全体のバイト数が 1024 bytes でなければ
  1230. ならないという制約を受けます。
  1231.  
  1232.  
  1233. 4)改行コードの認識
  1234.  CGItools のコマンド群は、Windows 形式(CR+LF)、Unix 形式(LF)、
  1235. Mac 形式(CR)のすべての改行コードを認識します。実行結果として出
  1236. 力される改行コードは、入力として与えたファイルの改行コードと同
  1237. 一です。
  1238.  
  1239.  
  1240. 5)Windows NT 4.0 を使うときの注意
  1241.  CGI を行わせるためのサーバとして Windows NT を使用するときは、
  1242. 次の点に注してください。
  1243.  
  1244.  a)環境変数 TMP, TEMP について
  1245.   環境変数 TMP, TEMP はデフォルトでは、システムの値として登録
  1246.  されておらず、ユーザーレベルで登録されています。コントロールパ
  1247.  ネルから「システム」を選択し、「環境」の設定において、上覧のシ
  1248.  ステム用の環境変数のところに、TMP, TEMP として、C:\TEMP 等を設
  1249.  定してください。
  1250.  
  1251.  b)空メモリの減少について
  1252.   CGItools を CGI 用に使い続けていると、すこしづつ空メモリが減
  1253.  少していく事があります。このような場合は、時々再起動してやる必
  1254.  要があります。schedule サービスの at コマンドを用い、一般に用
  1255.  いられている再起動ソフトウエアを定期的に実行するようにすればよ
  1256.  いでしょう。
  1257.  
  1258.  c)削除されないテンポラリファイルの蓄積について
  1259.   CGItools を CGI 用に使い続けていると、WINNT フォルダまたは、
  1260.  TEMP フォルダに、sci*.tmp と言うファイル名を持ったテンポラリ
  1261.  ファイルが蓄積される事があります。これも、②と同様に、at コマ
  1262.  ンドを用いて定期的に削除するようにすればよいでしょう。
  1263.  
  1264. ⑩更新状況
  1265.  
  1266. ver2.001
  1267.  ・1024 byte を超えるファイルを POST したときの、exmain ステート
  1268.  メントにおける永久ループを回避。
  1269.  ・p4b-vb.exe の追加と、これに対応させて post4bat.exe を変更。こ
  1270.  れにより、Microsoft peer web serveces 等に対応。
  1271. //